//
// Description: 5970. 参加会议的最多员工数
// Created by Loading on 2022/1/3.
//

#include <bits/stdc++.h>

using namespace std;

int maximumInvitations(vector<int> &favorite) {
    int n = favorite.size();
    // 每个节点的入度数组，访问标记数组，节点的最大深度
    vector<int> indegree(n), visit(n), depth(n);
    // 存储每个节点的入度
    for (int i = 0; i < n; ++i) {
        int v = favorite[i];
        indegree[v]++;
    }
    queue<int> q;
    // 入度为 0 的节点，入队列
    for (int i = 0; i < n; ++i) {
        if (indegree[i] == 0) {
            q.emplace(i);
            visit[i] = 1;
        }
    }

    // 计算每个节点的深度
    while (!q.empty()) {
        int u = q.front();
        int v = favorite[u];
        q.pop();
        depth[v] = max(depth[v], depth[u] + 1);
        if (--indegree[v] == 0) {
            q.emplace(v);
            visit[v] = 1;
        }
    }

    // dfs计算环的长度
    int ring_len = 0;
    function<void(int)> dfs = [&](int u) {
        if (visit[u] == 0) {
            visit[u] = 1;
            ++ring_len;
            dfs(favorite[u]);
        }
    };

    // 环的长度为 2 的累计结果，环的长度大于 2 的环的长度
    int len_two = 0, len_max = 0;
    // 查找环
    for (int i = 0; i < n; ++i) {
        // 非环
        if (visit[i] == 1) {
            continue;
        }
        ring_len = 0;
        dfs(i);
        if (ring_len == 2) {
            // 环长度为 2，加入两个节点的最大深度
            len_two += depth[i] + depth[favorite[i]] + 2;
        } else {
            // 环长度大于 2，更新环的最大长度
            len_max = max(len_max, ring_len);
        }
    }

    return max(len_two, len_max);
}

int main() {
    vector<int> favorite = {1, 2, 0};
    int res = maximumInvitations(favorite);
    cout << res << endl;

    return 0;
}